package me.zhengjie.modules.equipment.util;

import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.EnumMap;
import java.util.Hashtable;
import java.util.Map;

public class QrCodeCreateUtil {
    /**
     *  * 生成包含字符串信息的二维码图片
     *  * @param outputStream 文件输出流路径
     *  * @param content 二维码携带信息
     *  * @param qrCodeSize 二维码图片大小
     *  * @param imageFormat 二维码的格式
     *  * @throws WriterException
     *  * @throws IOException
     *  
     */
    public static boolean createQrCode(OutputStream outputStream, String content, int qrCodeSize, String imageFormat) throws WriterException, IOException {
//设置二维码纠错级别ＭＡＰ
        Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>();
        hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);// 矫错级别
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
//创建比特矩阵(位矩阵)的QR码编码的字符串
        BitMatrix byteMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, qrCodeSize, qrCodeSize, hintMap);
// 使BufferedImage勾画QRCode  (matrixWidth 是行二维码像素点)
        int matrixWidth = byteMatrix.getWidth();
        int revise = matrixWidth * 2 / 9;
        BufferedImage image = new BufferedImage(matrixWidth - revise, matrixWidth - revise, BufferedImage.TYPE_INT_RGB);
        image.createGraphics();
        Graphics2D graphics = (Graphics2D) image.getGraphics();
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, matrixWidth, matrixWidth);
// 使用比特矩阵画并保存图像
        graphics.setColor(Color.BLACK);
        for (int i = 0; i < matrixWidth; i++) {
            for (int j = 0; j < matrixWidth; j++) {
                if (byteMatrix.get(i, j)) {
                    graphics.fillRect(i - revise / 2, j - revise / 2, 1, 1);
                }
            }
        }
        return ImageIO.write(image, imageFormat, outputStream);
    }

    /**
     *  * 读二维码并输出携带的信息
     *  
     */
    public static String readQrCode(InputStream inputStream) throws IOException {
//从输入流中获取字符串信息
        BufferedImage image = ImageIO.read(inputStream);
//将图像转换为二进制位图源
        LuminanceSource source = new BufferedImageLuminanceSource(image);
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
        QRCodeReader reader = new QRCodeReader();
        Result result = null;
        try {
            Map<DecodeHintType,Object> hints = new EnumMap<DecodeHintType,Object>(DecodeHintType.class);
            hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
            result = reader.decode(bitmap,hints);
        } catch (ReaderException e) {
            e.printStackTrace();
        }
        return result.getText();
    }

    /**
     *  * 测试代码
     *  * @throws WriterException
     *  
     */
    public static void main(String[] args) throws IOException, WriterException {
        String content = "设备编号:123456\r\n名称:交换机\r\n序列号:43981923";
        content = new String(content.getBytes("UTF-8"), "ISO-8859-1");
        String path = "d:\\var\\test.jpg";
        createQrCode(new FileOutputStream(new File(path)), content, 90, "JPEG");
        String info = readQrCode(new FileInputStream(new File(path)));
        System.out.println(info);
    }
}
